RocksonLee's Blog
avatar
RocksonLee
2022-02-17 21:38:24
  • 本文总阅读量

祭上一次blog已经3个月了,我成为鸽子了...

这道题就跑两遍kmp看毛片就可以解决问题,但是一些小问题由于码力解决较晚。

解决用时1.5h

注意点1.tnt[1]=1!!!!!

注意点2.tnt用完就扔,别memset了

#include <bits/stdc++.h>
using namespace std;

#define N 1000010
#define MOD 1000000007
#define pl(a) ((a) % MOD)
#define cl(a, b) memset(a, b, sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
char str[N];
int kmp[N], tnt[N];
ull ans;
void init()
{
    cl(str, 0);
    cl(kmp, 0);
    ans = 1;
}

int main()
{
    int T;
    scanf("%d", &T);
    for (int kkz = 0; kkz < T; kkz++)
    {
        init();
        scanf("%s", str + 1);
        tnt[1] = 1;
        int lens = strlen(str + 1);
        for (int i = 2, j = 0; i <= lens; i++)
        {
            while (j && str[i] != str[j + 1]) j = kmp[j];
            if (str[i] == str[j + 1])
                j++;
            kmp[i] = j;
            tnt[i] = tnt[j] + 1;
        }
        for (int i = 2, j = 0; i <= lens; i++)
        {
            while (j && str[i] != str[j + 1]) j = kmp[j];
            if (str[i] == str[j + 1])
                j++;
            while (j * 2 > i) j = kmp[j];
            // printf("---T:%d,good:%c,i:%d,j:%d,sum:%d\n", kkz, str[i], i, j, tnt[j]);
            ans = pl(ans * (tnt[j] + 1));
        }
        printf("%llu\n", ans);
    }
    return 0;
}
LG P2375 [NOI2014] 动物园
comment评论
Search
search